import json
import os
import shutil
import uuid
import zipfile

import requests

from config.config import MainConfig

CACHE = MainConfig.cachePath  # 缓存目录，用来存储临时文件夹/文件
APP_ID = "cli_a57bdd72d9f3100b"
APP_SECRET = "RONC3ZfrMmJuBabbFN7OuhU1cVoe2Y1f"


def create_folder():
    """
    随机生成并创建一个文件夹并返回
    :return: 文件夹路径
    """
    # 生成随机文件夹名称
    folder_name = str(uuid.uuid4())
    # 指定在当前目录的cache目录下创建文件夹
    base_path = os.path.join(os.getcwd(), CACHE)
    folder_path = os.path.join(base_path, folder_name)
    # 创建文件夹
    os.makedirs(folder_path)
    return folder_path


def is_zip_file(file_path):
    """
    判断是否是zip文件
    :param file_path:文件路径
    :return:是否是zip文件
    """
    with open(file_path, 'rb') as file:
        header = file.read(2)
        if header == b'PK':
            return True
        else:
            return False


def unzip(zip_path, extract_to_path):
    """
    解压文件
    # 注意：这段代码假设ZIP文件内的文件名使用的是GB2312编码。实际上，编码方式会根据创建ZIP文件时所用的系统和设置而有所不同。
    # 如果你知道确切的编码方式，应该将'gbk'替换为相应的编码。
    :param zip_path: 被解压的zip文件
    :param extract_to_path: 解压到的文件夹
    """
    with zipfile.ZipFile(zip_path, 'r') as zip_ref:
        for file_info in zip_ref.infolist():
            extracted_path = os.path.join(extract_to_path, file_info.filename)

            # 尝试修改文件名编码（这里以GB2312为例，根据实际情况可能需要调整为'gbk'等）
            try:
                extracted_path = os.path.join(extract_to_path, file_info.filename.encode('cp437').decode('gbk'))
            except:
                pass  # 如果尝试解码失败，则使用原始文件名

            # 创建包含文件的目录（如果尚不存在）
            os.makedirs(os.path.dirname(extracted_path), exist_ok=True)

            # 解压文件
            with zip_ref.open(file_info) as source, open(extracted_path, 'wb') as target:
                shutil.copyfileobj(source, target)


class FeiShuDownload:
    def __init__(self):
        self.zip_name = "download.zip"
        self.folder_path = None

    def download_file(self, file_token):
        """
        下载文件，保存到本地并解压
        :param file_token: 文件token
        :return: 解压后的文件夹路径
        """
        # 下载文件
        url = f"https://open.feishu.cn/open-apis/drive/v1/files/{file_token}/download"
        headers = {"Authorization": self._get_tenant_access_token()}
        params = {"file_token": file_token}
        response = requests.request("GET", url, headers=headers, params=params)
        content = response.content
        return content

    def save_zip_file(self, content):
        """
        根据二进制文件内容保存文件,并解压
        :param content: 二进制文件内容
        :return: 解压后的文件夹路径
        """
        # 获取文件夹路径
        folder_path = create_folder()
        # 保存文件 到 folder_path
        file_path = os.path.join(folder_path, self.zip_name)
        with open(file_path, 'wb') as file:
            file.write(content)

        if not is_zip_file(file_path): raise Exception("不是zip文件")

        # 解压文件
        unzip(file_path, folder_path)
        return folder_path

    @staticmethod
    def _get_tenant_access_token():
        """
        获取企业自建应用的凭证
        :return: 企业自建应用的凭证
        """
        url = "https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal"
        payload = json.dumps({
            "app_id": APP_ID,
            "app_secret": APP_SECRET
        })

        headers = {
            'Content-Type': 'application/json'
        }

        response = requests.request("POST", url, headers=headers, data=payload)
        try:
            return "Bearer " + response.json()['tenant_access_token']
        except Exception as e:
            return False


if __name__ == "__main__":
    fs = FeiShuDownload()
    "NINtba5u5o7fGfxj0rdc9FhLnFe"
    "H7Etb52nmo7JxAxOXEAcbYnSnNb"
    content = fs.download_file("EEgbbKtxVoh38kxqsT1cv1oEnKd")
    folder_path = fs.save_zip_file(content)
    print(folder_path)
